2023/12/231917字符

生成器

生成器:高配版迭代器

function *fn () {
    console.log('111');
    yield 1;  // 产生一个数据
    console.log('222');
    yield 2;
    console.log('333');
    // 生成器中的 return 相当于产生最后一个数据,return之后不再生成数据,提前结束生成器函数
}
let generator = fn();
generator.next();  //--> 111 {value: 1, done: false}
generator.next();  //--> 222 {value: 2, done: false}
generator.next();  //--> 333 {value: undefined, done: false}

数组迭代

const arr = [1, 2, 3, 4, 5];
function *createIterator (arr) {
    for (const item of arr) {
        yield item;
    }
}
let iterator = createIterator(arr);
iterator.next();  //--> {value: 1, done: false}
iterator.next();  //--> {value: 2, done: false}
iterator.next();  //--> {value: 3, done: false}

函数累加器

function* fn () {  // 生成器函数传参毫无意义
    let n = 0
    while (true) {
        yield n;
        n++;
    }
}
let iter = fn();
iter.next();  //--> {value: 0, done: false}
iter.next();  //--> {value: 1, done: false}
iter.next();  //--> {value: 2, done: false}

斐波纳列数列

function *createFeiboIterator () {
    let prev1 = 1, prev2 = 2, n = 1;
    while (true) {
        if (n <= 2) {
            yield 1;
        } else {
            const newValue = prev1 + prev2;
            yield newValue;
            prev2 = prev1;
            prev1 = newValue;
        }
        n++;
    }
}
let iter = createFeiboIterator()
iter.next();  //--> {value: 1, done: false}
iter.next();  //--> {value: 1, done: false}
iter.next();  //--> {value: 3, done: false}

生成器嵌套调用

function* fn1() {
    yield 1;
    yield 2;
}
function* fn2() {
    yield *fn1();
    yield 3;
    yield 4;
}
let iter = fn2();